package com.holystone.splunk.app.service;

import com.splunk.Index;
import org.codehaus.jackson.JsonNode;

import java.io.IOException;
import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * Copyright (c) 2017, HOLYSTONE Technologies, Inc.
 * All right reserved.
 *
 * @author huyan
 * @date 2017/12/1
 * @desc:
 */
public interface ISplunkIndexService extends ISplunkBaseService {

    /**
     * 创建一个新的index
     * @param indexName
     *      要插入的index的名称
     * @return
     */
    Index createNewIndex(String indexName);

    /**
     * 根据indexName获取index
     * @param indexName
     *      要获取的index的名称
     * @return
     */
    Index getIndexByName(String indexName);

    /**
     * 向index中插入数据
     * @param indexName
     *      指定将数据存入哪个index
     * @param sourcetype
     *      指定sourcetype
     * @param insertData
     *      要插入的值：JSON格式
     */
    void insertData2Index(String indexName, String sourcetype, String insertData) throws IOException;

    /**
     * 删除存储在index中的数据，返回被删除的行数(Splunk不建议删除，方法保留，但不使用)
     *
     * @param sourcetype
     *      指定sourcetype
     * @param value
     *      要删除记录的唯一标识：告警sid或者事件id
     * @return
     */
    Integer deleteDataFromIndex(String sourcetype, Object value) throws IOException;

    /**
     * 所有查询方法的基方法，返回查询的总对象
     *
     * @param query
     *      查询语句
     * @param pageNo
     *      查询分页的当前页
     * @param pageSize
     *      查询分页的页大小
     * @param earliest
     *      查询的开始时间
     * @param latest
     *      查询的结束时间
     * @return
     * @throws IOException
     */
    JsonNode search(String query, Integer pageNo, Integer pageSize, Date earliest, Date latest) throws IOException;

    /**
     * 封装查询的返回数据
     *
     * @param query
     *      查询语句
     * @param earliest
     *      查询的开始时间
     * @param latest
     *      查询的结束时间
     * @return
     */
    List<JsonNode> getResultsFormSearch(String query, Date earliest, Date latest) throws IOException;

    /**
     * 获取 _raw 数据，用作封装成javaBean对象
     *
     * @param query
     *      查询语句
     * @param pageNo
     *      查询分页的当前页
     * @param pageSize
     *      查询分页的页大小
     * @param earliest
     *      查询的开始时间
     * @param latest
     *      查询的结束时间
     * @return
     */
    List<JsonNode> getDataFromIndex(String query, Integer pageNo, Integer pageSize, Date earliest, Date latest) throws IOException;

    /**
     * 获取统计数据（自定义查询）
     * getDataFromIndex获取的是Splunk封装的_raw属性值
     * 这个方法获取的是自定义属性的值
     *
     * @param indexName
     *      指定的index
     * @param sourcetype
     *      指定的sourcetype
     * @param statisName
     *      要统计的字段名称
     * @return
     */
    List<String> getDIYStatisticaData(String indexName, String sourcetype, String statisName) throws IOException;

    /**
     * 获取自定义语句的统计结果
     *
     * @param query
     *      查询语句
     * @param statisName
     *      要统计的自定义字段名称
     * @param earliest
     *      查询开始日期
     * @param latest
     *      查询结束日期
     * @return
     */
    Integer getDIYTotalCount(String query, String statisName, Date earliest, Date latest) throws IOException;
    /**
     * 获取splunk中数据最后日期
     * @param query
     * @param statisName
     * @return
     * @throws IOException
     */
    String getEnddate(String query, String statisName)throws IOException;
}
